import pandas as pd


def process_excel_package_matching(excel1_path, excel2_path, excel3_path, output_path=None):
    """
    处理Excel文件中的包ID匹配

    参数:
    excel1_path: Excel1文件路径（包含【包id】列）
    excel2_path: Excel2文件路径（包含【课程包ID】列，对应周末智学高一）
    excel3_path: Excel3文件路径（包含【课程包ID】列，对应周末智学高二）
    output_path: 输出文件路径（可选，默认为excel1_updated.xlsx）
    """

    type_dict_a = {
        '讲课后习题原卷id': str,  # 将ID字段设为字符串
        # 其他可能的long类型字段也设为str
        '讲id': str,
        '包id': str,
    }

    type_dict_b = {
        '课程包ID': str
    }

    try:
        # 读取Excel文件
        print("正在读取Excel文件...")
        df1 = pd.read_excel(excel1_path, dtype=type_dict_a)
        df2 = pd.read_excel(excel2_path, dtype=type_dict_b)
        df3 = pd.read_excel(excel3_path, dtype=type_dict_b)

        print(f"Excel1 形状: {df1.shape}")
        print(f"Excel2 形状: {df2.shape}")
        print(f"Excel3 形状: {df3.shape}")

        # 检查必要的列是否存在
        if '包id' not in df1.columns:
            raise ValueError("Excel1中找不到【包id】列")
        if '课程包ID' not in df2.columns:
            raise ValueError("Excel2中找不到【课程包ID】列")
        if '课程包ID' not in df3.columns:
            raise ValueError("Excel3中找不到【课程包ID】列")

        # 获取Excel2和Excel3中的课程包ID集合（去除空值）
        excel2_package_ids = set(df2['课程包ID'].dropna())
        excel3_package_ids = set(df3['课程包ID'].dropna())

        print(f"Excel2中课程包ID数量: {len(excel2_package_ids)}")
        print(f"Excel3中课程包ID数量: {len(excel3_package_ids)}")

        # 在Excel1中添加两个新列
        # 是否在周末智学高一使用
        df1['是否在周末智学高一使用'] = df1['包id'].apply(
            lambda x: '是' if pd.notna(x) and x in excel2_package_ids else '否'
        )

        # 是否在周末智学高二使用
        df1['是否在周末智学高二使用'] = df1['包id'].apply(
            lambda x: '是' if pd.notna(x) and x in excel3_package_ids else '否'
        )

        # 统计匹配情况
        high1_match_count = (df1['是否在周末智学高一使用'] == '是').sum()
        high2_match_count = (df1['是否在周末智学高二使用'] == '是').sum()

        print(f"\n匹配结果统计:")
        print(f"在周末智学高一中匹配到的包ID数量: {high1_match_count}")
        print(f"在周末智学高二中匹配到的包ID数量: {high2_match_count}")

        # 保存结果
        if output_path is None:
            output_path = 'excel1_updated.xlsx'

        df1.to_excel(output_path, index=False)
        print(f"\n处理完成！结果已保存到: {output_path}")

        # 显示前几行结果预览
        print(f"\n结果预览:")
        relevant_columns = ['包id', '是否在周末智学高一使用', '是否在周末智学高二使用']
        print(df1[relevant_columns].head(10))

        return df1

    except Exception as e:
        print(f"处理过程中出现错误: {str(e)}")
        return None


# 使用示例
if __name__ == "__main__":
    # 修改这些路径为你的实际文件路径
    excel1_path = "D:\\project_file\\老卷下线\\课后习题绑定的讲和包数据\\课后习题绑定的讲和包数据.xlsx"  # 包含【包id】列的文件
    excel2_path = "D:\\project_file\\老卷下线\\周末智学 高一(课程包信息).xlsx"  # 周末智学高一，包含【课程包ID】列
    excel3_path = "D:\\project_file\\老卷下线\\周末智学 高二（课程包信息）.xlsx"  # 周末智学高二，包含【课程包ID】列

    # 处理文件
    result_df = process_excel_package_matching(excel1_path, excel2_path, excel3_path)

    # 如果需要指定输出文件名
    # result_df = process_excel_package_matching(excel1_path, excel2_path, excel3_path, "输出结果.xlsx")